#!/bin/bash

# 脚本名称：create_vdisk_qcow2.sh

# 功能说明：
# 本脚本用于创建 QCOW2 格式的虚拟磁盘，并在其上创建分区和文件系统。

# 主要流程包括：
# 1. 安装必要的依赖工具（如 qemu-utils、parted 等）。
# 2. 创建一个 QCOW2 格式的虚拟磁盘。
# 3. 将虚拟磁盘连接到 NBD 设备。
# 4. 在虚拟磁盘上创建一个主分区。
# 5. 将主分区格式化为 ext4 文件系统。
# 6. 列举虚拟磁盘的分区信息。
# 7. 断开 NBD 设备，完成操作。

# 注意事项：
# - 需要 root 权限运行部分命令，如 qemu-nbd、parted、mkfs.ext4。
# - 在执行磁盘操作前，建议备份重要数据，以防万一。

# 配置参数
disk_image="${1:-vdisk.qcow2}"  # 虚拟磁盘文件名，默认为 vdisk.qcow2
disk_size="${2:-4G}"            # 磁盘大小，默认为 4G
nbd_device="${3:-/dev/nbd0}"    # NBD 设备，默认为 /dev/nbd0

# 检查并安装依赖
check_deps() {
    echo "检查并安装依赖软件包..."
    required_packages=(qemu-utils parted util-linux)
    for package in "${required_packages[@]}"; do
        if ! dpkg -l | grep -q "$package"; then
            echo "安装 $package..."
            sudo apt-get install -y "$package"
        else
            echo "$package 已安装"
        fi
    done
}

# 创建虚拟磁盘
create_disk() {
    echo "创建虚拟磁盘: $disk_image ($disk_size)"
    if ! qemu-img create -f qcow2 "$disk_image" "$disk_size"; then
        echo "创建虚拟磁盘失败"
        exit 1
    fi
}

# 连接虚拟磁盘
connect_nbd() {
    echo "连接 NBD 设备: $nbd_device"
    sudo modprobe nbd max_part=16
    if ! sudo qemu-nbd -c "$nbd_device" "$disk_image"; then
        echo "连接 NBD 设备失败"
        exit 1
    fi
    sleep 2  # 等待设备初始化
}

# 创建分区
create_partition() {
    echo "创建主分区..."
    if ! echo -e "o\nn\np\n1\n\n\nw" | sudo fdisk "$nbd_device"; then
        echo "创建分区失败"
        exit 1
    fi
    sudo partprobe "$nbd_device"
}

# 格式化分区
format_partition() {
    echo "格式化分区为 ext4..."
    if ! sudo mkfs.ext4 "${nbd_device}p1"; then
        echo "格式化分区失败"
        exit 1
    fi
}

# 列举磁盘信息
list_disk_info() {
    echo "列举磁盘信息..."
    sleep 2  # 等待系统识别和更新分区信息
    lsblk -f "$nbd_device"
}

# 断开虚拟磁盘
disconnect_nbd() {
    echo "断开 NBD 设备..."
    if ! sudo qemu-nbd -d "$nbd_device"; then
        echo "断开 NBD 设备失败"
        exit 1
    fi
}

# 主流程
main() {
    trap disconnect_nbd EXIT  # 确保在脚本结束时断开 NBD 设备
    check_deps
    create_disk
    connect_nbd
    create_partition
    format_partition
    list_disk_info
    disconnect_nbd
    echo "虚拟磁盘创建完成: $disk_image"
}

# 执行主流程
main
